パソコン活用研究PCマニアックの道(アセンブラ、DOS、Windows、旧型PCの活用研究)
Lispの入手
1 Lispの入手
1) Lispとは
Lispは人工知能言語とよばれ、他のプログラミング言語とはかなり趣を異にします。
その昔(CP/M時代)はLispというとかなり高価なもので、なかなか入手して使える人はいなかった
と思いますが、今はフリーのLispがたくさんあります。
Lispは、非常に方言が多い言語として知られており、多くのフリーLispもそれぞれに異なっています。
「Free Compiler」にLispのサイトを揚げてありますので、いろいろ調べてみてください。
BASIC,C,FORTRANなどとはまったく別物の言語です。全然今までと違った言語をかじってみたい
という人は、いちどLispを触ってみることをおすすめします。
2) XLISP
フリーLispとしては代表的なものです。割とオーソドックスなLisp?ではないでしょうか。
XLISPにもいろんなバージョンがありますが、おじさんはWindows上で使えるXLISPのバージョンで
xl304winというものを使っています。解凍するだけで使えます。
「Free Compiler」に揚げたLispのサイトからダウンロードできます。
3) yoolw
Tanaka Yuji氏作のWindowsで使えるLispです。CommonLispに近い仕様です。XLISPとも近い仕様
です。これも解凍するだけで使えてお手軽です。Vectorからダウンロードできるはずですので、
探して下さい。
4) その他
フリーのLispはその他たくさんあります。
2 XLISP(xl304win)を使って見る
解凍するだけで使えます。Binフォルダにある、xlwin32.exeをクリックすると、起動して以下のような
画面が立ち上がります。
>
を表示して入力待ち状態になっていますので、続けてコマンド(関数)を記述すればO.K.です。
ちなみにLispはほとんどがインタプリタです。このXLISPもインタプリタです。
まず、足し算をしてみましょう。 7+9 は以下のように記述します。
> (+ 7 9)
(関数 引数 引数 ・・ ・・)
という形式で記述します。
+ は加算の関数です。
Lispでは、全て( )で囲んで関数を記述します。
( )
内の各要素は空白で区切ります。 区切り記号としてカンマ , は使いませんので注意して下さい。
Lispの最大?の特色はListの扱いにあります。Listとは要素を(
) で囲んだものです。
上記画面の2個めのコマンド(関数)にある (list
1 2 3)が1,2,3 という要素をもったListです。
この2個めのコマンド(関数)にある、car はListの先頭の要素を返す関数です。
cdr はListの先頭の要素を省いたListを返す関数です。
従って
> (car (cdr(list 1 2 3)))
は、Listの2番目の要素である 2を返します。
この手のList処理は、他の言語、例えばBasicなどでは非常にプログラムしにくい処理です。
Lispの得意技の分野といえるでしょう。
3個目以下のコマンド(関数)は、関数を定義した別の外部ファイル(拡張子.lsp)を読み込んでから
実行したものです。メニューバーの[File]-[Open/load]で外部ファイルを読み込みます。
ここで読み込んだ関数は以下の通りです。
(defun first(a b c) (car (list a b c))) (defun plusf(a b c) (setq x (car (list a b c))) (+ x 1)) (defun plusf&e(a b c) (setq z (list a b c)) (setq x (car z)) (setq y (car(cdr(cdr z)))) (+ x y)) (defun plusf&e2(a b c) (+ a c)) |
defun
で関数(ユーザー定義関数)を定義します。
(defun 関数名(引数) (実行部))
という形式になります。
定義された関数は、(関数名 引数 ・・ ・・)
という形で、既に組み込まれている組み込み関数と同じ
形式で使うことができます。
ユーザー定義関数の定義の形式は各Lispにより割と方言の多いところです。他のLispでは若干違ったり
します。
上記のユーザー定義関数の中で使っている setq
は
(setq a x)
と記述すると、他の言語でいうところの a = x
(代入)になります。
やっていることは単純なので、ご自分で考えてみて下さい。
なお、plusf&e , plusf&e2
は同じ結果を得ます。
3 Yoolw
Yoolwも解凍するだけで、Windows上で使えます。
Yoolw.exeをクリックすると、以下の画面が立ち上がります。
Yoolwでは画面が2段構成になっています。上段は、実行結果の表示画面で、下段の1行の部分に
コマンド(関数)を記述します。
ユーザー定義関数は、以下のように記述するパターンが一般的です。(ユーザー定義関数のタイプにより異なる)
(de '関数名 ' (lambda(引数) (実行部)))
1個目の関数は加算です。
2個目のユーザー定義関数 s はXlispでやったのと同じです。2番目の要素を取り出します。
Yoolwでも、メニューバーの[File]-[Open File]でユーザー定義関数を記述した外部ファイルを読み込むことが
できます。Yoolwでは、拡張子 .yo
のファイルです。
上記では、maxp_x_y (x,yの大きい方を返す)、 seco (Listの2番目の要素を返す)というユーザー定義関数
を記述したファイルを読み込みました。
読み込んだ関数は以下の通りです。
(de 'maxp_x_y '(lambda(x y)(prog() (print "MAX") (cond((greaterp x y) x)(t y)) ))) (de 'seco '(lambda(x y z)(car (cdr(list x y z))))) |
cond はBASICでいうところの if と同じ働きをします。
(cond (条件式1 処理1) (条件式2 処理2))
という記述になります。
条件式で (greaterp x y) は x>y ならばです。
t は真(=true)ということで、条件式として使うと、常に成立することになります。
この場合、Basicでいうところの else
と同等の働きをすることになります。
cond の行をBasicで記述すると
if x > y then print x else print y
と同等になります。
4 終わりに
ほんのさわりだけですが、Lispの紹介をしてみました。いかがでしたでしょうか。
BASIC、C、FORTRANなどとは全然別の言語体系です。まったく違った言語で遊んでみたいという人は
Lispに手を出してみたら、はまるかもしれません。